package cn.edu.suda.ada.database.objects;

import org.apache.commons.lang3.StringUtils;

import java.util.HashSet;
import java.util.Set;

/**
 * 索引结构类
 * 
 * @author JiangJun
 */
public class Key {
	/**
	 * 索引名称，可为空
	 */
	private String name;
	/**
	 * 索引类型
	 */
	private Type type = Type.PRIMARY;
	/**
	 * 索引方式
	 */
	private Method method = null;
	/**
	 * 索引列名
	 */
	private Set<String> columns = new HashSet<String>();

	/**
	 * 索引类型
	 */
	public enum Type {
		PRIMARY("PRIMARY KEY"), UNIQUE("UNIQUE KEY"), NORMAL("KEY");
		private String key;

		Type(String key) {
			this.key = key;
		}

		@Override
		public String toString() {
			return key;
		}

		/**
		 * 根据索引名称和索引是否为空获得具体的索引类型
		 * 
		 * @param name 当前索引名称
		 * @param duplicate 是否非重复
		 * @return 索引类型
		 */
		public static Type getType(String name, String duplicate) {
			if (name.equals("PRIMARY")) {
				return PRIMARY;
			} else if (duplicate.equals("0")) {
				return UNIQUE;
			}
			return NORMAL;
		}
	}

	/**
	 * 索引方式
	 */
	public enum Method {
		BTREE("BTREE"), HASH("HASH");
		private String method;

		Method(String method) {
			this.method = method;
		}

		@Override
		public String toString() {
			return method;
		}

		/**
		 * 根据索引方法名称获得具体的索引方法
		 * 
		 * @param method 索引方法名称
		 * @return 索引方法
		 */
		public static Method getMethod(String method) {
			if (method != null)	return Enum.valueOf(Method.class, method.trim().toUpperCase());
			return null;
		}
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Type getType() {
		return type;
	}

	public void setType(Type type) {
		this.type = type;
	}

	public Method getMethod() {
		return method;
	}

	public void setMethod(Method method) {
		this.method = method;
	}

	public Set<String> getColumns() {
		return columns;
	}

	public void setColumns(Set<String> columns) {
		this.columns = columns;
	}

	/**
	 * 新增索引列
	 * 
	 * @param columnName 索引列名
	 */
	public void addColumn(String columnName) {
		this.columns.add(columnName);
	}

	/**
	 * 删除索引列
	 * 
	 * @param columnName 索引列名
	 */
	public void removeColumn(String columnName) {
		this.columns.remove(columnName);
	}
	
	/*-----------------------------------------------------------------------
	 * 覆盖equals 和 hashCode
	 * ----------------------------------------------------------------------*/

	@Override
	public int hashCode() {
		if (null == name) {
			return super.hashCode();
		}
		return name.hashCode();
	}

	@Override
	public boolean equals(Object obj) {
		if (!(obj instanceof Key)) {
			return false;
		}
		Key key = (Key) obj;
		if (null == key || null == key.getColumns() || null == columns || key.getColumns().size() != columns.size()) {
			return false;
		}
		if (!key.getName().equals(name)) {
			return false;
		}
		for (String col : key.getColumns()) {
			if (!columns.contains(col)) {
				return false;
			}
		}
		return true;
	}

	@Override
	public String toString() {
		return String.format("Key : {name = %s , type = %s , method = %s , columns = %s }",
				name, type, method, StringUtils.join(columns.toArray(), ','));
	}
}
